<?php

/**La classe BlogServicelmpl réalise l'interface BlogService. Elle doit:
*
*-conserver le titre du blog (type string) et la liste de tous les billets publiés sur le blog (type array).
*
*-définir un constructeur dont le paramètre est le nom du blog.
*
*-définir les méthode de l'interface BlogService.
*
*
*Les méthodes retournant une liste ne doivent pas retourner une référence NULL. Si il n'y a pas d'éléments à retourner, alors une liste vide doit être retournée.
*Le billet le plus récent est celui dont la date de publication est la plus élevée.
*/
class BlogServicelmpl implements BlogService {
    private $titre;
    private $Post= array();
    private $findItem= array();
    private $ByTags= array();
    private $ByContent= array();
    private $ByTagsOrContent= array();
    private $nb_post=0;

	public function __construct ($BlogTitle) {
        $this->titre = $BlogTitle;
	}

	public function getTitle (){
	/**La méthode getTitle() sans paramètre, permet de donner le titre du blog.*/
        return $this->titre;
    }

	public function post ($Publishable){
	/**La méthode post() dont le paramètre est un billet du même type que Publishable, sans retour, permettant de de publier un nouveau billet.*/
        $this->Post($this->nb_post) = new AbstractPublishabletem ($Date, "$Publishable");
        $this->nb_post++;
    }

	public function getItems (){
	/**La méthode getItems() sans paramètre, dont le type de retour est une liste, permet d'obtenir la liste de billets publiés sur le blog.*/
        return print_r($this->Post);
    }

	public function getPublishableItemsCount (){
	/**La méthode PublishableItemsCount() sans paramètre, dont le type de retour est une valeur entière, permet de connaître le nombre de billets sur le blog.*/
        return $this->nb_post=count($this->Post);
        }

	public function getTaggableItemsCount (){
	/**La méthode getTaggableItemsCount() sans paramètre, dont le type de retour est  est une valeur entière, permet de connaître le nombre de billets publiés aux quels l'on peut rajouter des tags.*/
        $TaggableItems=0;
        for ($i=0, $i<=$this->nb_post, $i++){
            if(method_exists($this->Post($i), 'addTagg'){
                $TaggableItems++;
            }
        }
        return $TaggableItems;
    }
    

	public function findItemsByAuthor ($auteur){
	/**La méthode findItemsByAuthor() dont le paramètre est le nom d'un auteur et dont le type de retour est une liste, permet de consulter la liste des billets rédigés par un auteur donné.*/
        unset($this->findItem);
        if (nb_post==0){
            return print_r($this->findItem);
        } else {
            for ($i=0, $i<=$this->nb_post, $i++){
                if ($this->Post($i)->getAuthor()== "$auteur"){
                    $this->findItem($i)=$this->Post($i);
                }
            }
            return print_r($this->findItem);
        }
    }
    

	public function getLatestItem (){
	/**La méthode getLatestItems sans paramètres, dont le type de retour est un billet, permet d'obtenir le billet le plus récent.*/
        for ($i=1, $i<=$this->nb_post, $i++){
            if ($this->Post($i)->getPublicationDate()> $this->Post($i+1)->getPublicationDate()){
                $this->LatestItem=$this->Post($i);
            }
        }
        return $this->LatestItem;
    }
    

	public function findItemsByTags ($listtag){
	/**La méthode findItemsByTags() dont le paramètre est un tableau de tag, dont le type de retour est une liste de billets, permet de consulter les billets dont le tag est passé en paramètre.*/
        unset($this->ByTags);
        if (nb_post==0){
            return print_r($this->ByTags);
        } else {        
            for ($i=1, $i<=$this->nb_post, $i++){
                if ($this->Post($i)->getTags()== implode(" ", $listtag)){
                    $this->ByTags($i)=$this->Post($i);
                }
            }
            return print_r($this->ByTags);
        }        
    }

	public function findItemsByContent ($content);
	/**La méthode findItemsByContent() dont le paramètre est un tableau, dont le type de retour est une liste de billets, permet de consulter tous les billets dont le corps du message comporte tous les mots données en paramètres.*/
    unset($this->ByContent);
        if (nb_post=0){
            return print_r($this->ByContent);
        } else { 
            for ($i=1, $i<=$this->nb_post, $i++){
                if ($this->Post($i)->getContent()== implode(" ", $content)){
                    $this->ByContent($i)=$this->Post($i);
                }
            }
            return print_r($this->ByContent);
        }
    }        

	public function findItemsByTagsOrContent ($tagcar){
	/**La méthode findItemsByTagsOrContent() dont le paramètre est un tableau, dont le type de retour est une liste de billets, permet de consulter tous les billets qui comportent les tags ou les corps de messages passés en arguments.*/
        unset($this->ByContent);
        if (nb_post=0){
            return print_r($this->ByContent);
        } else { 
             for ($i=1, $i<=$this->nb_post, $i++){
                if (strpos($this->Post($i)->getContent(), '$tagcar') !== FALSE or $this->Post($i)->getTags()== implode(" ", $tagcar)){
                    $this->ByTagsOrContent($i)=$this->Post($i);
                }
            }
            return print_r($this->ByTagsOrContent);
        }
    }               
        

}
